package datetime

import (
	"fmt"
	"time"
)

// JsonTime 是time.Time的自定义封装，支持JSON序列化和反序列化。
// 可以指定自定义的时间格式字符串，默认使用"2006-01-02 15:04:05"格式。
type JsonTime struct {
	time.Time
	FormatStr string // 自定义时间格式，如果为空则使用默认格式
}

// GetFormatStr 获取时间格式字符串。
// 如果设置了FormatStr则返回自定义格式，否则返回默认格式。
//
// 返回值:
//   - string: 时间格式字符串
func (j JsonTime) GetFormatStr() string {
	if j.FormatStr != "" {
		return j.FormatStr
	}
	return TimeFormatYMDhms
}

// MarshalJson 实现JsonTime的JSON序列化方法。
// 按照GetFormatStr返回的格式将时间序列化为字符串。
//
// 返回值:
//   - []byte: JSON格式的时间字符串
//   - error: 序列化错误
func (j JsonTime) MarshalJson() ([]byte, error) {
	timeStr := fmt.Sprintf("\"%s\"", j.Format(j.GetFormatStr()))
	return []byte(timeStr), nil
}

// UnmarshalJson 实现JsonTime的JSON反序列化方法。
// 将JSON字符串解析为时间对象，使用GetFormatStr返回的格式进行解析。
//
// 参数:
//   - data: JSON格式的时间字符串
//
// 返回值:
//   - error: 解析错误
//
// 注意:
//   - 如果解析失败会返回零值时间
func (j *JsonTime) UnmarshalJson(data []byte) (err error) {
	newTime, _ := time.ParseInLocation("\""+j.GetFormatStr()+"\"", string(data), time.Local)
	j.Time = newTime
	return
}

// String 返回格式化后的时间字符串。
// 使用GetFormatStr返回的格式进行格式化。
//
// 返回值:
//   - string: 格式化后的时间字符串
func (j JsonTime) String() string {
	return j.Time.Format(j.GetFormatStr())
}
